# -*- coding: utf-8 -*-
'''
# file name:6、生成器如何执行的.PY
# author： azj
# datetime： 2022/7/8 16:13 
# ide： PyCharm
'''


def f():
    print('没有yield时，该内容会被打印')
    a= 1
    yield a
    print('`````````')
    a= 2
    yield a


def f2():
    result = []
    result.append(1)

    result.append(2)
    return result




# 想一想，什么情况下会执行生成器对象的__next__方法呢？
# 1、获取生成器下一个值的时候 使用对象.__next__ 方法  使用__next__ 超过迭代次数时 会报异常  for 不会
# 2、使用 for 循环 迭代器对象  但是会忽略报错

if __name__ == '__main__':
    obj= f() # 如果一个函数中有yield函数， 调用函数的时候不会执行函数中的内容，会返回一个生成器对象（这个对象是生成器类）
    print(type(obj)) # <class 'generator'>

    # 是不是迭代器
    print(hasattr(obj,"__next__")) # True  # 当访问的生成器的__next__方法时，函数会变成running状态 当执行yield时，函数为非running状态（即挂起）

    for i, value in enumerate(obj):
        print(i,value)

    # print(obj.__next__())
    # print(obj.__next__())
    # print(obj.__next__())


'''
yield 和return 的区别

共同点： 都是python 的关键字

不同点： 

return 是函数返回的标志  是结束函数并返回值

yield: 是暂时离开函数 后期还会回来的什么时候回来
:return



'''